﻿//weak_ptr弱引用指针—不支持RAII，不参与资源管理
//template<class T>
//class weak_ptr
//{
//public:
//	weak_ptr()
//		:_ptr(nullptr)
//	{}
//
//	weak_ptr(const shared_ptr<T>& sp)
//	{
//		_ptr = sp.get();
//	}
//
//	weak_ptr<T>& operator=(const shared_ptr<T>& sp)
//	{
//		_ptr = sp.get();
//		return *this;
//	}
//
//	T& operator*()
//	{
//		return *_ptr;
//	}
//	T* operator->()
//	{
//		return _ptr;
//	}
//private:
//	T* _ptr;
//};

//namespace bit
//{
//	template <class T>
//	class shared_ptr
//	{
//	public:
//		//删除器构造
//		template <class D>
//		shared_ptr(T* ptr, D del)
//			: _ptr(ptr)
//			, _pcount(new int(1))
//			, _del(del)
//		{	}
//
//		shared_ptr(T* ptr = nullptr)
//			: _ptr(ptr)
//			, _pcount(new int(1))
//		{	}
//		~shared_ptr()
//		{
//			release();
//		}
//		..........
//	private:
//		void release()
//		{
//			(*_pcount)--;
//			if (*_pcount == 0)
//			{
//				delete _pcount;
//				std::cout << "delete _ptr" << std::endl;
//				//使用删除器进行删除，这里不能单单删除类似delete _ptr的类型了
//				//delete _ptr;
//				_del(_ptr);
//			}
//		}
//		..........
//		T* _ptr;
//		int* _pcount;
//		//使用包装器接收万能删除器函数，默认情况下单独使用delete 析构
//		function<void(T*)> _del = [](T* ptr) {delete ptr; };
//	};
//}

//struct ListNode
//{
//	int _val;
//	//bit::shared_ptr<ListNode> _next;
//	//bit::shared_ptr<ListNode> _prev;
//
//	bit::weak_ptr<ListNode> _next;
//	bit::weak_ptr<ListNode> _prev;
//
//	ListNode(int val = 0)
//		:_val(val)
//	{}
//	~ListNode()
//	{
//		cout << "~ListNode()" << endl;
//	}
//};
//
//template<class T>
//struct DeleteArray
//{
//	void operator()(T* ptr)
//	{
//		delete[] ptr;
//	}
//};
//
//int main()
//{
//	/*bit::shared_ptr<ListNode> p1(new ListNode(10));
//	bit::shared_ptr<ListNode> p2(new ListNode[10], DeleteArray<ListNode>());*/
//
//	std::shared_ptr<ListNode> p1(new ListNode(10));
//	std::shared_ptr<ListNode> p2(new ListNode[10], DeleteArray<ListNode>());
//
//	////bit::shared_ptr<FILE> p3(fopen("Test.cpp", "r"), [](FILE* ptr) {fclose(ptr); });
//	return 0;
//}
